Cover TOC Chap Prev Chap Prev Fig Next Fig Next Chap

Chapter 15: Building Extruded Shapes

../ch15/15fig17.gif
Figure 15.17

A wiggling snake whose spine is animated using a CoordinateInterpolator node.

15fig17.wrl
Click on the image to view the VRML scene.

#VRML V2.0 utf8
# The VRML 2.0 Sourcebook
# Copyright (c) 1997
# Andrea L. Ames, David R. Nadeau, and John L. Moreland
Group {
    children [

    # Ground
        Shape {
            appearance Appearance {
                material Material {
                    diffuseColor 0.6 0.6 0.0
                }
            }
            geometry Box { size 20.0 0.01 20.0 }
        },
    # Snake shape
        Transform {
            translation 0.0 0.3 0.0
            children Shape {
                appearance Appearance {
                    material Material {
                        diffuseColor 0.0 1.0 0.2
                    }
                }
                geometry DEF Snake Extrusion {
                    creaseAngle 1.57
                    crossSection [
                    # Circle
                         1.00  0.00,   0.92 -0.38,
                         0.71 -0.71,   0.38 -0.92,
                         0.00 -1.00,  -0.38 -0.92,
                        -0.71 -0.71,  -0.92 -0.38,
                        -1.00 -0.00,  -0.92  0.38,
                        -0.71  0.71,  -0.38  0.92,
                         0.00  1.00,   0.38  0.92,
                         0.71  0.71,   0.92  0.38,
                         1.00  0.00
                    ]
                    spine [
                    # Sine wave
                        -4.100 0.0  0.000,  -4.000 0.0  0.000,
                        -3.529 0.0  0.674,  -3.059 0.0  0.996,
                        -2.588 0.0  0.798,  -2.118 0.0  0.184,
                        -1.647 0.0 -0.526,  -1.176 0.0 -0.962,
                        -0.706 0.0 -0.895,  -0.235 0.0 -0.361,
                         0.235 0.0  0.361,   0.706 0.0  0.895,
                         1.176 0.0  0.962,   1.647 0.0  0.526,
                         2.118 0.0 -0.184,   2.588 0.0 -0.798,
                         3.059 0.0 -0.996,   3.529 0.0 -0.674,
                         4.000 0.0  0.000,
                    ]
                    scale [
                        0.050 0.020,  0.200 0.100,
                        0.400 0.150,  0.300 0.300,
                        0.300 0.300,  0.300 0.300,
                        0.300 0.300,  0.300 0.300,
                        0.300 0.300,  0.300 0.300,
                        0.290 0.290,  0.290 0.290,
                        0.290 0.290,  0.280 0.280,
                        0.280 0.280,  0.250 0.250,
                        0.200 0.200,  0.100 0.100,
                        0.050 0.050,
                    ]
                }
            }
        },
    # Animation clock
        DEF Clock TimeSensor {
            cycleInterval 4.0
            loop TRUE
        },
    # Animation morph
        DEF SnakeWiggle CoordinateInterpolator {
            key [ 0.0, 0.25, 0.50, 0.75, 1.0 ]
            keyValue [
            # time 0.0 position
                -4.100 0.0  0.000,  -4.000 0.0  0.000,
                -3.529 0.0  0.674,  -3.059 0.0  0.996,
                -2.588 0.0  0.798,  -2.118 0.0  0.184,
                -1.647 0.0 -0.526,  -1.176 0.0 -0.962,
                -0.706 0.0 -0.895,  -0.235 0.0 -0.361,
                 0.235 0.0  0.361,   0.706 0.0  0.895,
                 1.176 0.0  0.962,   1.647 0.0  0.526,
                 2.118 0.0 -0.184,   2.588 0.0 -0.798,
                 3.059 0.0 -0.996,   3.529 0.0 -0.674,
                 4.000 0.0  0.000,
            # time 0.25 position
                -4.100 0.0 -1.000,  -4.000 0.0 -1.000,
                -3.529 0.0 -0.739,  -3.059 0.0 -0.092,
                -2.588 0.0  0.603,  -2.118 0.0  0.983,
                -1.647 0.0  0.850,  -1.176 0.0  0.274,
                -0.706 0.0 -0.446,  -0.235 0.0 -0.932,
                 0.235 0.0 -0.932,   0.706 0.0 -0.446,
                 1.176 0.0  0.274,   1.647 0.0  0.850,
                 2.118 0.0  0.983,   2.588 0.0  0.603,
                 3.059 0.0 -0.092,   3.529 0.0 -0.739,
                 4.000 0.0 -1.000,
            # time 0.50 position
                -4.100 0.0  0.000,  -4.000 0.0  0.000,
                -3.529 0.0 -0.674,  -3.059 0.0 -0.996,
                -2.588 0.0 -0.798,  -2.118 0.0 -0.184,
                -1.647 0.0  0.526,  -1.176 0.0  0.962,
                -0.706 0.0  0.895,  -0.235 0.0  0.361,
                 0.235 0.0 -0.361,   0.706 0.0 -0.895,
                 1.176 0.0 -0.962,   1.647 0.0 -0.526,
                 2.118 0.0  0.184,   2.588 0.0  0.798,
                 3.059 0.0  0.996,   3.529 0.0  0.674,
                 4.000 0.0  0.000,
            # time 0.75 position
                -4.100 0.0  1.000,  -4.000 0.0  1.000,
                -3.529 0.0  0.739,  -3.059 0.0  0.092,
                -2.588 0.0 -0.603,  -2.118 0.0 -0.983,
                -1.647 0.0 -0.850,  -1.176 0.0 -0.274,
                -0.706 0.0  0.446,  -0.235 0.0  0.932,
                 0.235 0.0  0.932,   0.706 0.0  0.446,
                 1.176 0.0 -0.274,   1.647 0.0 -0.850,
                 2.118 0.0 -0.983,   2.588 0.0 -0.603,
                 3.059 0.0  0.092,   3.529 0.0  0.739,
                 4.000 0.0  1.000,
            # time 1.0 position
                -4.100 0.0  0.000,  -4.000 0.0  0.000,
                -3.529 0.0  0.674,  -3.059 0.0  0.996,
                -2.588 0.0  0.798,  -2.118 0.0  0.184,
                -1.647 0.0 -0.526,  -1.176 0.0 -0.962,
                -0.706 0.0 -0.895,  -0.235 0.0 -0.361,
                 0.235 0.0  0.361,   0.706 0.0  0.895,
                 1.176 0.0  0.962,   1.647 0.0  0.526,
                 2.118 0.0 -0.184,   2.588 0.0 -0.798,
                 3.059 0.0 -0.996,   3.529 0.0 -0.674,
                 4.000 0.0  0.000,
            ]
        }
    ]
}
ROUTE Clock.fraction_changed    TO SnakeWiggle.set_fraction
ROUTE SnakeWiggle.value_changed TO Snake.set_spine